package org.android.brasil.projetos.oktoberfest2011.view.controller;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.android.brasil.projetos.oktoberfest2011.R;
import org.android.brasil.projetos.oktoberfest2011.negocio.model.Apresentacao;
import org.android.brasil.projetos.oktoberfest2011.persistencia.ApresentacaoDAO;
import org.android.brasil.projetos.oktoberfest2011.utils.Constantes;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;

public class WidgetController {

	private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	private static Date diaOktoberfest;
	private static long ONE_DAY = 24L * 60L * 60L * 1000L;

	/**
	 * Retorna o número de dias entre a data atual do dispositivo e
	 * {@link Oktoberfest2011WidgetProvider#diaOktoberfest}
	 * 
	 * @return Dias de diferença entre as datas
	 */
	public static int getDiasParaEvento() {
		if (WidgetController.diaOktoberfest == null) {
			try {
				WidgetController.diaOktoberfest = sdf.parse(Constantes.DIA_MES_ANO);
				
			} catch (ParseException e) {
				return 0;
			}
		}
		long agora = System.currentTimeMillis();
		long diff = WidgetController.diaOktoberfest.getTime() - agora;
		return diff < 0 ? (int) ((diff / (ONE_DAY))) : (int) (diff / (ONE_DAY)) + 1;
	}
	
	/**
	 * Retorna o número de dias do evento
	 * 
	 * 
	 * @return Dias de evento
	 */
	public static int getDiasDeEvento() {
		if (WidgetController.diaOktoberfest == null) {
			try {
				WidgetController.diaOktoberfest = sdf.parse(Constantes.DIA_MES_ANO);
				
			} catch (ParseException e) {
				return 0;
			}
		}
		long agora = System.currentTimeMillis();
		long diff = WidgetController.diaOktoberfest.getTime() - agora;
		return 1 + ((int) (diff / (ONE_DAY)) + 1) * -1 ;
	}

	public static int escolherImagemNumeroDia(int dias) {
		switch (dias) {
		case 0:
			dias = R.drawable.zero;
			break;
		case 1:
			dias = R.drawable.um;
			break;
		case 2:
			dias = R.drawable.dois;
			break;
		case 3:
			dias = R.drawable.tres;
			break;
		case 4:
			dias = R.drawable.quatro;
			break;
		case 5:
			dias = R.drawable.cinco;
			break;
		case 6:
			dias = R.drawable.seis;
			break;
		case 7:
			dias = R.drawable.sete;
			break;
		case 8:
			dias = R.drawable.oito;
			break;
		case 9:
			dias = R.drawable.nove;
			break;
		default:
			dias = R.drawable.zero;
			break;
		}
		return dias;
	}

	public static void agendarAtualizacaoDiaria(Context context, String actionWidgetReceiver) {
		// TODO (luiz) discutir necessidade de Alarm Manager, ao invés de
		// definir o intervalo
		// de atualização no ProviderInfo do widget
		Intent intent = new Intent(actionWidgetReceiver);
		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
		AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

		long day = 24 * 60 * 60 * 1000;
		long now = System.currentTimeMillis();
		long trigger = now + day - (now % day);
		alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, trigger,
				AlarmManager.INTERVAL_DAY, pendingIntent);
	}

	public static boolean temDesfileHoje(Context context) {
		boolean retorno = false;
		if ((Calendar.getInstance().get(Calendar.MONTH) == Constantes.CALENDAR_MES_DA_OKTOBERFEST)
				&& (Calendar.getInstance().get(Calendar.YEAR) == Constantes.ANO_DA_OKTOBERFEST)) {
			ApresentacaoDAO.open(context);
			retorno = ApresentacaoDAO.temDesfile(Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
			ApresentacaoDAO.close();
		}
		return retorno;
	}

	public static Apresentacao getDesfileDeHoje(Context context) {
		ApresentacaoDAO.open(context);
		Apresentacao apr = ApresentacaoDAO.consultarDesfile(Calendar.getInstance().get(
				Calendar.DAY_OF_MONTH));
		ApresentacaoDAO.close();
		return apr;
	}
}
